package com.welike.shibo.exception;

import com.welike.shibo.eneity.JsonResult;
import com.welike.shibo.enums.ResultEnum;
import com.welike.shibo.utils.ResultUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.UnauthenticatedException;
import org.apache.shiro.authz.UnauthorizedException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 全局异常拦截
 *
 * @author fangyu
 * @version v1.0.0
 * @since 2019/11/22 11:35 上午
 */
@Slf4j
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {

//    @ExceptionHandler(value = Exception.class)
//    public JsonResult defaultErrorHandler(HttpServletRequest req, Exception e) {
//        String errorPosition = "";
//        //如果错误堆栈信息存在
//        if (e.getStackTrace().length > 0) {
//            StackTraceElement element = e.getStackTrace()[0];
//            String fileName = element.getFileName() == null ? "未找到错误文件" : element.getFileName();
//            int lineNumber = element.getLineNumber();
//            errorPosition = fileName + ":" + lineNumber;
//        }
//        log.error("异常", e);
//        String errorMsg = e.toString() + "    错误位置:" + errorPosition;
//        return ResultUtils.error(ResultEnum.SYSTEM_ERROR.getCode(), errorMsg);
//    }

    /**
     * GET/POST请求方法错误的拦截器
     * 因为开发时可能比较常见,而且发生在进入controller之前,上面的拦截器拦截不到这个错误
     * 所以定义了这个拦截器
     */
    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
    public JsonResult httpRequestMethodHandler() {
        return ResultUtils.error(ResultEnum.E_500);
    }

    /**
     * 本系统自定义错误的拦截器
     * 拦截到此错误之后,就返回这个类里面的json给前端
     * 常见使用场景是参数校验失败,抛出此错,返回错误信息给前端
     */
    @ExceptionHandler(JsonResultException.class)
    public JsonResult commonJsonExceptionHandler(JsonResultException JsonResultException) {
        return JsonResultException.getResultJson();
    }

    /**
     * 权限不足报错拦截
     */
    @ExceptionHandler(UnauthorizedException.class)
    public JsonResult unauthorizedExceptionHandler() {
        return ResultUtils.error(ResultEnum.E_502);
    }

    /**
     * 未登录报错拦截
     * 在请求需要权限的接口,而连登录都还没登录的时候,会报此错
     */
    @ExceptionHandler(UnauthenticatedException.class)
    public JsonResult unauthenticatedException() {
        return ResultUtils.error(ResultEnum.E_20011);
    }
}

